home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / CODECS.ZIP / codecs / francais / dcodrle3.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-13  |  3.9 KB  |  108 lines

  1. /* Fichier: dcodrle3.c
  2.    Auteur: David Bourgin
  3.    Date de creation: 1/2/94
  4.    Date de derniere mise a jour: 22/5/94
  5.    Dessein: Exemple de decodage RLE type 3 avec comme donnees a decompresser le contenu d'un fichier.
  6. */
  7.  
  8. #include <stdio.h>
  9. /* Pour les routines printf,fgetc,fputc,fread */
  10. #include <stdlib.h>
  11. /* Pour la routine exit */
  12.  
  13. /* Codes d'erreur renvoyes a l'appelant */
  14. #define NO_ERROR      0
  15. #define BAD_FILE_NAME 1
  16. #define BAD_ARGUMENT  2
  17.  
  18. /* Constantes pratiques */
  19. #define FALSE 0
  20. #define TRUE  1
  21.  
  22. /* Variables globales */
  23. FILE *f_source,*f_dest;
  24.  
  25.                              /* Puisque fgetc=EOF uniquement apres un acces
  26.                                 alors statut_octet_stocke vaut TRUE si un octet a ete engrange par fgetc
  27.                                 ou FALSE s'il n'y aucun octet valide, deja lu et non traite dans val_octet_stocke */
  28. int statut_octet_stocke=FALSE;
  29. int val_octet_stocke;
  30.  
  31. /* Pseudo procedures */
  32. #define fin_des_donnees() (statut_octet_stocke?FALSE:!(statut_octet_stocke=((val_octet_stocke=fgetc(f_source))!=EOF)))
  33. #define lire_octet()  (statut_octet_stocke?statut_octet_stocke=FALSE,(unsigned char)val_octet_stocke:(unsigned char)fgetc(f_source))
  34. #define lire_tableau(tableau,nb_a_lire)  ((void)fread((tableau),1,(nb_a_lire),f_source))
  35. #define ecrire_octet(octet)  ((void)fputc((octet),f_dest))
  36. #define ecrire_tableau(tableau,nb_octets_a_ecrire)  ((void)fwrite((tableau),1,(nb_octets_a_ecrire),f_dest))
  37.  
  38. void decodagerle3()
  39. /* Parametres en sortie: Aucun
  40.    Action: Decompresse suivant la methode RLE type 3 tous les octets lus par la fonction lire_octet
  41.    Erreurs: Une erreur d'entree/sortie peut perturber le deroulement de l'algorithme
  42. */
  43. { unsigned char octet_repere,octet_lu,nb_repetitions,
  44.                 trame[256];
  45.   register unsigned int longueur_trame,
  46.                         i;
  47.  
  48.   if (!fin_des_donnees())
  49.      { octet_repere=lire_octet();
  50.        do {                  /* Puisqu'il y a l'octet repeere c'est qu'il y a des donnees a decompresser */
  51.             octet_lu=lire_octet();
  52.             if (octet_lu==octet_repere)
  53.                              /* Codage d'une repetition ou de l'octet repere */
  54.                { nb_repetitions=lire_octet();
  55.                  longueur_trame=((unsigned int)lire_octet())+1;
  56.                  if (!nb_repetitions)
  57.                     for (i=1;i<=longueur_trame;i++)
  58.                         ecrire_octet(octet_repere);
  59.                  else { lire_tableau(trame,longueur_trame);
  60.                         for (i=0;i<=nb_repetitions;i++)
  61.                             ecrire_tableau(trame,longueur_trame);
  62.                       }
  63.                }
  64.             else ecrire_octet(octet_lu);
  65.           }
  66.        while (!fin_des_donnees());
  67.      }
  68. }
  69.  
  70. void aide()
  71. /* Parametres en sortie: Aucun
  72.    Action: Affiche l'aide du programme et termine son execution
  73.    Erreurs: Aucune
  74. */
  75. { printf("Cet utilitaire permet de decompresser un fichier par la methode RLE type 3\n");
  76.   printf("telle qu'elle est exposee dans 'La Video et Les Imprimantes sur PC'\n");
  77.   printf("\nUsage: dcodrle3 source destination\n");
  78.   printf("source: Nom du fichier a decompresser\n");
  79.   printf("destination: Nom du fichier decompresse\n");
  80. }
  81.  
  82. int main(argc,argv)
  83. /* Parametres en sortie: Renvoie un code d'erreur (0=Aucune)
  84.    Action: Procedure principale
  85.    Erreurs: Detectee, traitee et un code d'erreur est renvoye si necessaire
  86. */
  87. int argc;
  88. char *argv[];
  89. { if (argc!=3)
  90.      { aide();
  91.        exit(BAD_ARGUMENT);
  92.      }
  93.   else if ((f_source=fopen(argv[1],"rb"))==NULL)
  94.           { aide();
  95.             exit(BAD_FILE_NAME);
  96.           }
  97.        else if ((f_dest=fopen(argv[2],"wb"))==NULL)
  98.                { aide();
  99.                  exit(BAD_FILE_NAME);
  100.                }
  101.             else { decodagerle3();
  102.                    fclose(f_source);
  103.                    fclose(f_dest);
  104.                  }
  105.   printf("Execution de dcodrle3 achevee.\n");
  106.   return (NO_ERROR);
  107. }
  108.